package com.b1.taskmanager.start.gui;

import com.b1.taskmanager.api.TaskList;
import com.b1.taskmanager.listener.ViewDates;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import org.apache.log4j.Logger;

/**
 * Класс отрисовки главного окна программы
 * обеспечивает взаимодействие пользователя
 * с логикой программы через графический интерфейс.
 * 
 * Отрисовка элементов окна, а так же самого окна
 * описанна в конструкторе класса.
 */

public class MainWindow extends JFrame 
{
    private static final Logger log = Logger.getLogger(MainWindow.class);

    private JButton button;
    private JPanel panel;
    private JTable table;
    private JScrollPane scroll;
    private JLabel label = new JLabel();
    private DefaultTableModel modelTable;
    private TaskList taskList = new TaskList();
   
    
    public TableModel getTableModel()
    {
        return modelTable;
    }
    public void setTableModel(TableModel tm)
    {
        table.setModel(tm);
    }
    
    public MainWindow()
    {
        super("TaskManager");
        log.info("Start GUI");
        this.setSize(500, 270); 
        try 
        {
            java.awt.Toolkit jToolkit = java.awt.Toolkit.getDefaultToolkit();
            Dimension screenSize = jToolkit.getScreenSize();
            this.setLocation((int) (screenSize.getWidth()/4), (int) (screenSize.getHeight()/4));
        } 
        catch (AWTError ex) 
        {
            log.debug(MainWindow.class.getName(),ex);
        }
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        panel = new JPanel();
        panel.setLayout(null);

        button = new JButton("Add Task");
        button.setSize(120, 40);
        button.setLocation(340, 30);
        button.addActionListener(new ButtonEventListenerAddTask());
        panel.add(button);
        
        button = new JButton("Delete Task");
        button.setSize(120, 40);
        button.setLocation(340, 75);
        button.addActionListener(new ButtonEventListenerDelTask());
        panel.add(button);
        
        button = new JButton("Change Task");
        button.setSize(120, 40);
        button.setLocation(340, 120);
        button.addActionListener(new ButtonEventListenerChangeTask());
        panel.add(button);
        
        Thread listenerThread = new Thread(new Runnable() 
        {

            public void run() 
            {
                    ViewDates dd = new ViewDates();
                    taskList.addObserver(dd);
            }
        });

        listenerThread.start();
        String columnNames[] = {"Task","Date begin","Type","id"};
        String tempValues[][] = taskList.listToString();
        String dataValues[][] = new String[tempValues.length][4];
        for (int i = 0; i < dataValues.length; i++) 
        {
            dataValues[i][0] = tempValues[i][3]; //title
            dataValues[i][1] = tempValues[i][1]; //begin
            dataValues[i][2] = tempValues[i][4]; //type
            dataValues[i][3] = tempValues[i][0]; //id
            
        }
        modelTable = new DefaultTableModel(dataValues,columnNames);
        table = new JTable(modelTable);
        ListSelectionModel selModel = table.getSelectionModel();
        selModel.addListSelectionListener(new MainWindow.tableSelectionEvent());
        
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        javax.swing.table.TableColumn column = table.getColumnModel().getColumn(0);
        column.setPreferredWidth(80);
        column = table.getColumnModel().getColumn(1);
        column.setPreferredWidth(100);
        
        scroll = new JScrollPane(table);
        scroll.setSize(280,140);
        scroll.setLocation(20, 30);
        table.setPreferredScrollableViewportSize(new Dimension(180, 140));
        table.removeColumn(table.getColumnModel().getColumn(3)); // hide id column
        panel.add(scroll);
        
        button = new JButton("Show Contacts");
        button.setSize(120, 40);
        button.setLocation(20, 180);
        button.addActionListener(new ButtonEventListenerShowContact());
        panel.add(button);
        
        this.setContentPane(panel);
        
    }

    /**
     * слушатель события клик, на кнопке Add Task
     * открывает новое окно для добавления Task 
     */
    class ButtonEventListenerAddTask implements ActionListener 
    {

        public void actionPerformed(ActionEvent e) 
        {
            //JOptionPane.showMessageDialog(null,"Button ADD was pressedn", "Output",JOptionPane.PLAIN_MESSAGE);
            AddWindow app = new AddWindow(0);
            app.setVisible(true);
        }
    }
    
    /**
     * слушатель события клик, на кнопке Delete Task
     * выдает сообщение о подверждении удаления выбраного Task.
     * удаляет выбраный Task из списка и передает его id в метод удаления класса TaskList
     * xPath
     */
    class ButtonEventListenerDelTask implements ActionListener 
    {
        public void actionPerformed(ActionEvent e) 
        {
            if(label.getText().equals("")) JOptionPane.showMessageDialog(null,"don't select ", "Output",JOptionPane.PLAIN_MESSAGE);
            else 
            {
                //JOptionPane.showMessageDialog(null, "Button DEL " + label.getText(), "Output", JOptionPane.PLAIN_MESSAGE);
                if(taskList.delTask(Integer.parseInt(label.getText())))
                {
                    int sel = table.getSelectedRow(); 
                    modelTable.removeRow(sel);
                    table.setModel(modelTable);
                }
                else JOptionPane.showMessageDialog(null, "Mistake DEL " + label.getText(), "Output", JOptionPane.PLAIN_MESSAGE);
            }
        }
    }
    
    /**
     * слушатель события клик, на кнопке Change Task
     * открывает окно для изменения выбранного Task.
     * Передает id Task в метод изменения Task класса ChangeWindow     *
     */
    class ButtonEventListenerChangeTask implements ActionListener 
    {

        public void actionPerformed(ActionEvent e) 
        {
            if(label.getText().equals("")) JOptionPane.showMessageDialog(null,"don't select ", "Output",JOptionPane.PLAIN_MESSAGE);
            else
            { 
                //JOptionPane.showMessageDialog(null,"Button Change "+label.getText(), "Output",JOptionPane.PLAIN_MESSAGE);
                ChangeWindow cw = new ChangeWindow(0,Integer.parseInt(label.getText()));
                cw.setVisible(true);
            }
        }
    }
    
    /**
     * слушатель события клик, на записи таблицы Task
     * определяет id выбранного Task из таблицы
     */
    class tableSelectionEvent implements ListSelectionListener
    {
            public void valueChanged(ListSelectionEvent e) 
            {
                    String result = "";
                    int[] selectedRows = table.getSelectedRows();
                    for(int i = 0; i < selectedRows.length; i++) 
                    {
                         int selIndex = selectedRows[i];
                         TableModel model = table.getModel();
                         Object value = model.getValueAt(selIndex, 3);
                         result = result + value;
                    }
                    label.setText(result);
                    label.setVisible(false);
                    panel.add(label);
               } 
    }
    
    /**
     * слушатель события клик, на кнопке Show Contact
     * вызывает окно класса ShowContact
     */
    class ButtonEventListenerShowContact implements ActionListener 
    {

        public void actionPerformed(ActionEvent e) 
        {
            //JOptionPane.showMessageDialog(null,"Button ADD was pressedn", "Output",JOptionPane.PLAIN_MESSAGE);
            ShowContact app = new ShowContact();
            app.setVisible(true);
        }
    }
    

}
